// EdgeSharpen v1.1 ( jim.ro )=ps_2_0 // http://www.homecinema-fr.com/forum/viewtopic.php?t=29814317 sampler s0 : register(s0); float4 p0 : register(c0); float4 p1 : register(c1); #define width (p0[0]) #define height (p0[1]) #define counter (p0[2]) #define clock (p0[3]) #define one_over_width (p1[0]) #define one_over_height (p1[1]) #define PI acos(-1) #define NbPixel 1 #define Edge_threshold 0.2 #define Sharpen_val0 2.0 #define Sharpen_val1 0.125 float4 main(float2 tex : TEXCOORD0) : COLOR { // taille de NbPixel pixels float dx = NbPixel/width; float dy = NbPixel/height; float4 Res = 0; // Détection de contour par Prewitt // récuppération des 9 points // [ 1, 2, 3 ] // [ 4, 0, 5 ] // [ 6, 7, 8 ] float4 c0 = tex2D(s0, tex); float4 c1 = tex2D(s0, tex + float2(-dx,-dy)); float4 c2 = tex2D(s0, tex + float2(0,-dy)); float4 c3 = tex2D(s0, tex + float2(dx,-dy)); float4 c4 = tex2D(s0, tex + float2(-dx,0)); float4 c5 = tex2D(s0, tex + float2(dx,0)); float4 c6 = tex2D(s0, tex + float2(-dx,dy)); float4 c7 = tex2D(s0, tex + float2(0,dy)); float4 c8 = tex2D(s0, tex + float2(dx,dy)); // Calcul des 3 vecteurs dérivé (hor,vert, diag1, diag2) float4 delta1 = (c6+c4+c1-c3-c5-c8); float4 delta2 = (c4+c1+c2-c5-c8-c7); float4 delta3 = (c1+c2+c3-c8-c7-c6); float4 delta4 = (c2+c3+c5-c7-c6-c4); // calcul du Prewitt float value = length(abs(delta1) + abs(delta2) + abs(delta3) + abs(delta4))/6; // Si c'est un contour (vector lenght > Edge_threshold) => filtre de sharpen if(value > Edge_threshold ) { Res = c0 * Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * Sharpen_val1 ; // Pour voir les contour en rouge ... //Res = float4( 1.0, 0.0, 0.0, 0.0 ); return Res; } else return c0; }